ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π² C++ ΠΈ Qt

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ Π»Π΅ΠΊΡ†ΠΈΠΈ

  • Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°
  • ΠšΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π²Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄
  • Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π² C++
  • ΠšΠ»Π°ΡΡΡ‹ ΠΈ интСрфСйсы ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²
  • Π‘Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ
  • Π‘ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ
  • ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π² Qt
  • БСриализация Π΄Π°Π½Π½Ρ‹Ρ…
  • ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ
  • ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° (I/O streams) ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² C++. Они ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΉ интСрфСйс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ источниками ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…: Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, консолью, сСтСвыми соСдинСниями ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ устройствами.

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ прСимущСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

  1. Унификация - Π΅Π΄ΠΈΠ½Ρ‹ΠΉ интСрфСйс для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…
  2. Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ - автоматичСская ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ
  3. Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ - Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒ Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ ΠΈ настройкС
  4. Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ - оптимизированная буфСризация ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°
  5. Π’ΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ - компилятор ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² C++

ios_base
β”œβ”€β”€ ios
β”‚   β”œβ”€β”€ istream
β”‚   β”‚   β”œβ”€β”€ ifstream (Ρ„Π°ΠΉΠ»Ρ‹)
β”‚   β”‚   β”œβ”€β”€ istringstream (строки)
β”‚   β”‚   └── iostream
β”‚   β”œβ”€β”€ ostream
β”‚   β”‚   β”œβ”€β”€ ofstream (Ρ„Π°ΠΉΠ»Ρ‹)
β”‚   β”‚   β”œβ”€β”€ ostringstream (строки)
β”‚   β”‚   └── iostream
β”‚   └── iostream
β”‚       β”œβ”€β”€ fstream
β”‚       └── stringstream
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠšΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π²Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°

#include <iostream>
#include <string>

int main() {
    // Π’Ρ‹Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ…
    std::cout << "Hello, World!" << std::endl;
    std::cout << "Π’Π²Π΅Π΄ΠΈΡ‚Π΅ вашС имя: ";
    
    // Π’Π²ΠΎΠ΄ строки
    std::string name;
    std::getline(std::cin, name);
    
    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄
    int age = 25;
    std::cout << "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, " << name << "! Π’Π°ΠΌ " << age << " Π»Π΅Ρ‚." << std::endl;
    
    return 0;
}
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Π°

#include <iostream>
#include <iomanip>

void demonstrateFormatting() {
    double pi = 3.14159265359;
    int number = 42;
    
    // Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ
    std::cout << std::fixed << std::setprecision(2) << pi << std::endl;
    
    // Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ поля
    std::cout << std::setw(10) << number << std::endl;
    std::cout << std::left << std::setw(10) << "Hello" << "World" << std::endl;
    
    // ШСстнадцатСричный ΠΈ Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚
    std::cout << std::hex << number << std::endl;
    std::cout << std::oct << number << std::endl;
    std::cout << std::dec << number << std::endl;
    
    // Π‘ΡƒΠ»Π΅Π²Ρ‹ значСния
    bool flag = true;
    std::cout << std::boolalpha << flag << std::endl;
}
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π§Ρ‚Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…

#include <iostream>
#include <string>
#include <vector>

class ConsoleReader {
public:
    static int readInt(const std::string& prompt) {
        int value;
        std::cout << prompt;
        while (!(std::cin >> value)) {
            std::cin.clear(); // Бброс состояния ΠΏΠΎΡ‚ΠΎΠΊΠ°
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            std::cout << "НСвСрный Π²Π²ΠΎΠ΄. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ снова: ";
        }
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        return value;
    }
    
    static double readDouble(const std::string& prompt) {
        double value;
        std::cout << prompt;
        while (!(std::cin >> value)) {
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            std::cout << "НСвСрный Π²Π²ΠΎΠ΄. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ снова: ";
        }
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        return value;
    }
    
    static std::string readString(const std::string& prompt) {
        std::cout << prompt;
        std::string value;
        std::getline(std::cin, value);
        return value;
    }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π² C++

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ

#include <fstream>
#include <iostream>
#include <string>

class FileManager {
public:
    static bool writeToFile(const std::string& filename, const std::string& content) {
        std::ofstream file(filename);
        if (!file.is_open()) {
            std::cerr << "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» для записи: " << filename << std::endl;
            return false;
        }
        
        file << content;
        return file.good();
    }
    
    static std::string readFromFile(const std::string& filename) {
        std::ifstream file(filename);
        if (!file.is_open()) {
            std::cerr << "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» для чтСния: " << filename << std::endl;
            return "";
        }
        
        std::string content((std::istreambuf_iterator<char>(file)),
                           std::istreambuf_iterator<char>());
        return content;
    }
    
    static bool appendToFile(const std::string& filename, const std::string& content) {
        std::ofstream file(filename, std::ios::app);
        if (!file.is_open()) {
            std::cerr << "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» для добавлСния: " << filename << std::endl;
            return false;
        }
        
        file << content;
        return file.good();
    }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π Π΅ΠΆΠΈΠΌΡ‹ открытия Ρ„Π°ΠΉΠ»ΠΎΠ²

#include <fstream>

void demonstrateFileModes() {
    // Π—Π°ΠΏΠΈΡΡŒ с ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡŒΡŽ Ρ„Π°ΠΉΠ»Π°
    std::ofstream out1("file1.txt", std::ios::out);
    
    // Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°
    std::ofstream out2("file2.txt", std::ios::app);
    
    // Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ записи
    std::ofstream out3("file3.bin", std::ios::binary);
    
    // Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись
    std::fstream io("file4.txt", std::ios::in | std::ios::out);
    
    // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° (ошибка, Ссли сущСствуСт)
    std::ofstream out4("file5.txt", std::ios::out | std::ios::trunc);
    
    // ΠŸΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°
    std::fstream io2("file6.txt", std::ios::in | std::ios::out | std::ios::ate);
}
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Ρ„Π°ΠΉΠ»Π΅

#include <fstream>
#include <iostream>

class FilePositionManager {
public:
    static void demonstratePositioning() {
        std::fstream file("example.txt", std::ios::in | std::ios::out | std::ios::trunc);
        
        if (!file.is_open()) {
            std::cerr << "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ»" << std::endl;
            return;
        }
        
        // Π—Π°ΠΏΠΈΡΡŒ Π΄Π°Π½Π½Ρ‹Ρ…
        file << "Hello, World! This is a test file.";
        
        // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ Ρ„Π°ΠΉΠ»Π°
        file.seekg(0, std::ios::beg);
        
        // Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 5 символов
        char buffer[6] = {0};
        file.read(buffer, 5);
        std::cout << "ΠŸΠ΅Ρ€Π²Ρ‹Π΅ 5 символов: " << buffer << std::endl;
        
        // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π½Π° 7 ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π°
        file.seekg(7, std::ios::beg);
        
        // Π§Ρ‚Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… 5 символов
        file.read(buffer, 5);
        std::cout << "Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ с 7 ΠΏΠΎ 11: " << buffer << std::endl;
        
        // ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ
        std::streampos pos = file.tellg();
        std::cout << "ВСкущая позиция: " << pos << std::endl;
        
        // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π½Π° 10 символов ΠΎΡ‚ ΠΊΠΎΠ½Ρ†Π°
        file.seekg(-10, std::ios::end);
        file.read(buffer, 5);
        std::cout << "Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ Π·Π° 10 ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ ΠΎΡ‚ ΠΊΠΎΠ½Ρ†Π°: " << buffer << std::endl;
    }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠšΠ»Π°ΡΡΡ‹ ΠΈ интСрфСйсы ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ классы ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

#include <iostream>
#include <sstream>
#include <fstream>

class StreamHierarchyDemo {
public:
    // Π Π°Π±ΠΎΡ‚Π° с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ классом std::istream
    static void readFromStream(std::istream& stream) {
        std::string line;
        while (std::getline(stream, line)) {
            std::cout << "ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ: " << line << std::endl;
        }
    }
    
    // Π Π°Π±ΠΎΡ‚Π° с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ классом std::ostream
    static void writeToStream(std::ostream& stream, const std::string& data) {
        stream << data << std::endl;
    }
    
    static void demonstrateHierarchy() {
        // Π Π°Π±ΠΎΡ‚Π° с консолью
        std::cout << "=== Π Π°Π±ΠΎΡ‚Π° с консолью ===" << std::endl;
        writeToStream(std::cout, "Hello from console!");
        
        // Π Π°Π±ΠΎΡ‚Π° со строкой
        std::cout << "=== Π Π°Π±ΠΎΡ‚Π° со строкой ===" << std::endl;
        std::stringstream ss;
        writeToStream(ss, "Hello from string stream!");
        std::cout << "Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ строкового ΠΏΠΎΡ‚ΠΎΠΊΠ°: " << ss.str() << std::endl;
        
        // Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»ΠΎΠΌ
        std::cout << "=== Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»ΠΎΠΌ ===" << std::endl;
        std::ofstream file("test.txt");
        writeToStream(file, "Hello from file stream!");
        file.close();
        
        // Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°
        std::ifstream infile("test.txt");
        readFromStream(infile);
        infile.close();
    }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ манипуляторы

#include <iostream>
#include <iomanip>

// ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ манипулятор для Π²Ρ‹Π²ΠΎΠ΄Π° Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅
struct hex_format {
    int value;
    hex_format(int v) : value(v) {}
};

std::ostream& operator<<(std::ostream& os, const hex_format& hf) {
    return os << "0x" << std::hex << std::uppercase << std::setw(4) 
              << std::setfill('0') << hf.value << std::dec;
}

// ΠœΠ°Π½ΠΈΠΏΡƒΠ»ΡΡ‚ΠΎΡ€ для Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
struct timestamp {
    std::chrono::system_clock::time_point time;
    timestamp(std::chrono::system_clock::time_point t = std::chrono::system_clock::now()) 
        : time(t) {}
};

std::ostream& operator<<(std::ostream& os, const timestamp& ts) {
    auto time_t = std::chrono::system_clock::to_time_t(ts.time);
    os << std::put_time(std::localtime(&time_t), "%Y-%m-%d %H:%M:%S");
    return os;
}
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π‘Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π Π°Π±ΠΎΡ‚Π° с Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

#include <fstream>
#include <vector>
#include <cstdint>

class BinaryStreamManager {
public:
    // Π—Π°ΠΏΠΈΡΡŒ структуры Π² Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»
    struct DataRecord {
        uint32_t id;
        double value;
        char name[32];
    };
    
    static bool writeBinaryData(const std::string& filename, 
                               const std::vector<DataRecord>& records) {
        std::ofstream file(filename, std::ios::binary);
        if (!file.is_open()) {
            return false;
        }
        
        // Π—Π°ΠΏΠΈΡΡŒ количСства записСй
        size_t count = records.size();
        file.write(reinterpret_cast<const char*>(&count), sizeof(count));
        
        // Π—Π°ΠΏΠΈΡΡŒ самих записСй
        for (const auto& record : records) {
            file.write(reinterpret_cast<const char*>(&record), sizeof(record));
        }
        
        return file.good();
    }
    
    static std::vector<DataRecord> readBinaryData(const std::string& filename) {
        std::vector<DataRecord> records;
        std::ifstream file(filename, std::ios::binary);
        
        if (!file.is_open()) {
            return records;
        }
        
        // Π§Ρ‚Π΅Π½ΠΈΠ΅ количСства записСй
        size_t count;
        file.read(reinterpret_cast<char*>(&count), sizeof(count));
        
        // Π§Ρ‚Π΅Π½ΠΈΠ΅ записСй
        records.reserve(count);
        for (size_t i = 0; i < count; ++i) {
            DataRecord record;
            file.read(reinterpret_cast<char*>(&record), sizeof(record));
            records.push_back(record);
        }
        
        return records;
    }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ тСкстовыми ΠΈ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

#include <sstream>
#include <iomanip>

class DataConverter {
public:
    // ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΡƒΡŽ строку
    static std::string toHex(const std::vector<uint8_t>& data) {
        std::ostringstream oss;
        oss << std::hex << std::setfill('0');
        
        for (uint8_t byte : data) {
            oss << std::setw(2) << static_cast<int>(byte) << " ";
        }
        
        return oss.str();
    }
    
    // ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΉ строки Π² Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅
    static std::vector<uint8_t> fromHex(const std::string& hexStr) {
        std::vector<uint8_t> result;
        std::istringstream iss(hexStr);
        
        std::string byteStr;
        while (iss >> byteStr) {
            if (byteStr.length() == 2) {
                uint8_t byte = static_cast<uint8_t>(std::stoi(byteStr, nullptr, 16));
                result.push_back(byte);
            }
        }
        
        return result;
    }
    
    // БСзопасноС Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…
    static bool readBinarySafe(std::istream& stream, void* buffer, size_t size) {
        stream.read(static_cast<char*>(buffer), size);
        return stream.good() && stream.gcount() == static_cast<std::streamsize>(size);
    }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π‘ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Настройка Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ

#include <fstream>
#include <iostream>

class BufferManager {
public:
    static void demonstrateBuffering() {
        // ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ
        std::ofstream unbuffered("unbuffered.txt");
        unbuffered.setf(std::ios::unitbuf); // БуфСризация послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
        
        // Ручная буфСризация
        std::ofstream manual("manual.txt");
        char buffer[1024];
        manual.rdbuf()->pubsetbuf(buffer, sizeof(buffer));
        
        // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° состояния Π±ΡƒΡ„Π΅Ρ€Π°
        std::streambuf* buf = manual.rdbuf();
        
        std::cout << "Π Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π°: " << buf->pubseekoff(0, std::ios::cur, std::ios::out) << std::endl;
        
        // ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ очистка Π±ΡƒΡ„Π΅Ρ€Π°
        manual << "Π”Π°Π½Π½Ρ‹Π΅ для записи";
        manual.flush(); // ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ запись Π² Ρ„Π°ΠΉΠ»
        
        // Бинхронизация с фактичСским Ρ„Π°ΠΉΠ»ΠΎΠΌ
        manual.sync(); // Бинхронизация Π±ΡƒΡ„Π΅Ρ€Π° с диском
    }
    
    // ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π±ΡƒΡ„Π΅Ρ€ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ
    class CustomBuffer {
    private:
        static constexpr size_t BUFFER_SIZE = 8192;
        char buffer[BUFFER_SIZE];
        std::ofstream& stream;
        
    public:
        explicit CustomBuffer(std::ofstream& s) : stream(s) {
            stream.rdbuf()->pubsetbuf(buffer, BUFFER_SIZE);
        }
        
        void flush() {
            stream.flush();
        }
    };
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°

#include <fstream>
#include <chrono>
#include <vector>
#include <iostream>

class PerformanceTester {
public:
    static void compareIOPerformance() {
        const size_t DATA_SIZE = 1024 * 1024; // 1 ΠœΠ‘ Π΄Π°Π½Π½Ρ‹Ρ…
        std::vector<char> data(DATA_SIZE, 'A');
        
        // ВСст Π½Π΅Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ записи
        auto start = std::chrono::high_resolution_clock::now();
        testUnbufferedWrite(data, "unbuffered.dat");
        auto end = std::chrono::high_resolution_clock::now();
        auto unbufferedTime = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
        
        // ВСст Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ записи
        start = std::chrono::high_resolution_clock::now();
        testBufferedWrite(data, "buffered.dat");
        end = std::chrono::high_resolution_clock::now();
        auto bufferedTime = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
        
        std::cout << "НС буфСризированная запись: " << unbufferedTime.count() << " мс" << std::endl;
        std::cout << "БуфСризированная запись: " << bufferedTime.count() << " мс" << std::endl;
        std::cout << "УскорСниС: " << static_cast<double>(unbufferedTime.count()) / bufferedTime.count() << "x" << std::endl;
    }
    
private:
    static void testUnbufferedWrite(const std::vector<char>& data, const std::string& filename) {
        std::ofstream file(filename, std::ios::binary);
        file.setf(std::ios::unitbuf); // ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ
        
        for (char byte : data) {
            file.write(&byte, 1);
        }
    }
    
    static void testBufferedWrite(const std::vector<char>& data, const std::string& filename) {
        std::ofstream file(filename, std::ios::binary);
        file.write(data.data(), data.size());
    }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π² Qt

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

QFile ΠΈ QTextStream

#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <QCoreApplication>

class QtFileManager {
public:
    static bool writeTextFile(const QString& filename, const QString& content) {
        QFile file(filename);
        
        if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
            qDebug() << "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» для записи:" << file.errorString();
            return false;
        }
        
        QTextStream stream(&file);
        stream.setCodec("UTF-8"); // Установка ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ
        stream << content;
        
        file.close();
        return true;
    }
    
    static QString readTextFile(const QString& filename) {
        QFile file(filename);
        
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            qDebug() << "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» для чтСния:" << file.errorString();
            return QString();
        }
        
        QTextStream stream(&file);
        stream.setCodec("UTF-8");
        QString content = stream.readAll();
        
        file.close();
        return content;
    }
    
    static bool appendToFile(const QString& filename, const QString& content) {
        QFile file(filename);
        
        if (!file.open(QIODevice::Append | QIODevice::Text)) {
            qDebug() << "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» для добавлСния:" << file.errorString();
            return false;
        }
        
        QTextStream stream(&file);
        stream.setCodec("UTF-8");
        stream << content;
        
        file.close();
        return true;
    }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π Π°Π±ΠΎΡ‚Π° с Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Qt

#include <QFile>
#include <QDataStream>
#include <QVector>
#include <QDebug>

class QtBinaryManager {
public:
    struct NetworkPacket {
        quint32 id;
        quint32 timestamp;
        QString sender;
        QByteArray data;
        
        // ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ для сСриализации
        friend QDataStream& operator<<(QDataStream& stream, const NetworkPacket& packet) {
            stream << packet.id << packet.timestamp << packet.sender << packet.data;
            return stream;
        }
        
        friend QDataStream& operator>>(QDataStream& stream, NetworkPacket& packet) {
            stream >> packet.id >> packet.timestamp >> packet.sender >> packet.data;
            return stream;
        }
    };
    
    static bool writeBinaryData(const QString& filename, const QVector<NetworkPacket>& packets) {
        QFile file(filename);
        
        if (!file.open(QIODevice::WriteOnly)) {
            qDebug() << "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» для записи:" << file.errorString();
            return false;
        }
        
        QDataStream stream(&file);
        stream.setVersion(QDataStream::Qt_6_0); // Установка вСрсии Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°
        
        // Π—Π°ΠΏΠΈΡΡŒ количСства ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²
        stream << static_cast<quint32>(packets.size());
        
        // Π—Π°ΠΏΠΈΡΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²
        for (const auto& packet : packets) {
            stream << packet;
        }
        
        file.close();
        return true;
    }
    
    static QVector<NetworkPacket> readBinaryData(const QString& filename) {
        QVector<NetworkPacket> packets;
        QFile file(filename);
        
        if (!file.open(QIODevice::ReadOnly)) {
            qDebug() << "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» для чтСния:" << file.errorString();
            return packets;
        }
        
        QDataStream stream(&file);
        stream.setVersion(QDataStream::Qt_6_0);
        
        // Π§Ρ‚Π΅Π½ΠΈΠ΅ количСства ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²
        quint32 count;
        stream >> count;
        
        // Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²
        packets.reserve(count);
        for (quint32 i = 0; i < count; ++i) {
            NetworkPacket packet;
            stream >> packet;
            packets.append(packet);
        }
        
        file.close();
        return packets;
    }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΠΎΡ‚ΠΎΠΊΠΎΠ²Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Qt

#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <QCoreApplication>

class LargeFileProcessor {
public:
    static bool processLargeTextFile(const QString& inputFilename, 
                                    const QString& outputFilename,
                                    std::function<QString(const QString&)> processor) {
        QFile inputFile(inputFilename);
        QFile outputFile(outputFilename);
        
        if (!inputFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
            qDebug() << "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ»:" << inputFile.errorString();
            return false;
        }
        
        if (!outputFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
            qDebug() << "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ»:" << outputFile.errorString();
            inputFile.close();
            return false;
        }
        
        QTextStream inputStream(&inputFile);
        QTextStream outputStream(&outputFile);
        
        inputStream.setCodec("UTF-8");
        outputStream.setCodec("UTF-8");
        
        // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ„Π°ΠΉΠ»Π° построчно для экономии памяти
        qint64 lineCount = 0;
        while (!inputStream.atEnd()) {
            QString line = inputStream.readLine();
            QString processedLine = processor(line);
            outputStream << processedLine << "\n";
            
            lineCount++;
            if (lineCount % 10000 == 0) {
                qDebug() << "ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ строк:" << lineCount;
                QCoreApplication::processEvents(); // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий для прСдотвращСния зависания
            }
        }
        
        inputFile.close();
        outputFile.close();
        
        qDebug() << "ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°. ВсСго строк:" << lineCount;
        return true;
    }
    
    static qint64 countLines(const QString& filename) {
        QFile file(filename);
        
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            return -1;
        }
        
        QTextStream stream(&file);
        stream.setCodec("UTF-8");
        
        qint64 count = 0;
        while (!stream.atEnd()) {
            stream.readLine();
            count++;
        }
        
        file.close();
        return count;
    }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

БСриализация

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

БСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² C++

#include <fstream>
#include <string>
#include <vector>
#include <memory>

class Serializable {
public:
    virtual ~Serializable() = default;
    virtual void serialize(std::ostream& stream) const = 0;
    virtual void deserialize(std::istream& stream) = 0;
};

class NetworkMessage : public Serializable {
private:
    std::string sender_;
    std::string receiver_;
    std::string content_;
    uint64_t timestamp_;
    
public:
    NetworkMessage() : timestamp_(0) {}
    
    NetworkMessage(const std::string& sender, const std::string& receiver, 
                  const std::string& content)
        : sender_(sender), receiver_(receiver), content_(content) {
        timestamp_ = std::chrono::duration_cast<std::chrono::milliseconds>(
            std::chrono::system_clock::now().time_since_epoch()).count();
    }
    
    void serialize(std::ostream& stream) const override {
        // Π—Π°ΠΏΠΈΡΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² строк
        size_t senderSize = sender_.size();
        size_t receiverSize = receiver_.size();
        size_t contentSize = content_.size();
        
        stream.write(reinterpret_cast<const char*>(&senderSize), sizeof(senderSize));
        stream.write(sender_.data(), senderSize);
        
        stream.write(reinterpret_cast<const char*>(&receiverSize), sizeof(receiverSize));
        stream.write(receiver_.data(), receiverSize);
        
        stream.write(reinterpret_cast<const char*>(&contentSize), sizeof(contentSize));
        stream.write(content_.data(), contentSize);
        
        stream.write(reinterpret_cast<const char*>(&timestamp_), sizeof(timestamp_));
    }
    
    void deserialize(std::istream& stream) override {
        // Π§Ρ‚Π΅Π½ΠΈΠ΅ отправитСля
        size_t senderSize;
        stream.read(reinterpret_cast<char*>(&senderSize), sizeof(senderSize));
        sender_.resize(senderSize);
        stream.read(&sender_[0], senderSize);
        
        // Π§Ρ‚Π΅Π½ΠΈΠ΅ получатСля
        size_t receiverSize;
        stream.read(reinterpret_cast<char*>(&receiverSize), sizeof(receiverSize));
        receiver_.resize(receiverSize);
        stream.read(&receiver_[0], receiverSize);
        
        // Π§Ρ‚Π΅Π½ΠΈΠ΅ содСрТимого
        size_t contentSize;
        stream.read(reinterpret_cast<char*>(&contentSize), sizeof(contentSize));
        content_.resize(contentSize);
        stream.read(&content_[0], contentSize);
        
        // Π§Ρ‚Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠΈ
        stream.read(reinterpret_cast<char*>(&timestamp_), sizeof(timestamp_));
    }
    
    // Π“Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹
    const std::string& getSender() const { return sender_; }
    const std::string& getReceiver() const { return receiver_; }
    const std::string& getContent() const { return content_; }
    uint64_t getTimestamp() const { return timestamp_; }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

БСриализация Π² Qt с использованиСм QDataStream

#include <QObject>
#include <QByteArray>
#include <QDataStream>
#include <QFile>
#include <QDebug>

class SerializableObject : public QObject {
    Q_OBJECT
    
    Q_PROPERTY(QString name READ name WRITE setName)
    Q_PROPERTY(int id READ id WRITE setId)
    Q_PROPERTY(QByteArray data READ data WRITE setData)
    
private:
    QString name_;
    int id_;
    QByteArray data_;
    
public:
    explicit SerializableObject(QObject* parent = nullptr) 
        : QObject(parent), id_(0) {}
    
    // Π“Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹ ΠΈ сСттСры
    QString name() const { return name_; }
    void setName(const QString& name) { name_ = name; }
    
    int id() const { return id_; }
    void setId(int id) { id_ = id; }
    
    QByteArray data() const { return data_; }
    void setData(const QByteArray& data) { data_ = data; }
    
    // БСриализация Π² QByteArray
    QByteArray toByteArray() const {
        QByteArray byteArray;
        QDataStream stream(&byteArray, QIODevice::WriteOnly);
        stream.setVersion(QDataStream::Qt_6_0);
        
        stream << name_ << id_ << data_;
        return byteArray;
    }
    
    // ДСсСриализация ΠΈΠ· QByteArray
    bool fromByteArray(const QByteArray& byteArray) {
        if (byteArray.isEmpty()) {
            return false;
        }
        
        QDataStream stream(byteArray);
        stream.setVersion(QDataStream::Qt_6_0);
        
        stream >> name_ >> id_ >> data_;
        return stream.status() == QDataStream::Ok;
    }
    
    // БСриализация Π² Ρ„Π°ΠΉΠ»
    bool saveToFile(const QString& filename) const {
        QFile file(filename);
        
        if (!file.open(QIODevice::WriteOnly)) {
            qDebug() << "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» для записи:" << file.errorString();
            return false;
        }
        
        QDataStream stream(&file);
        stream.setVersion(QDataStream::Qt_6_0);
        
        // Π—Π°ΠΏΠΈΡΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°
        stream << QString("SerializableObject");
        stream << quint32(1); // ВСрсия Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°
        
        // Π—Π°ΠΏΠΈΡΡŒ Π΄Π°Π½Π½Ρ‹Ρ…
        stream << name_ << id_ << data_;
        
        file.close();
        return true;
    }
    
    // ДСсСриализация ΠΈΠ· Ρ„Π°ΠΉΠ»Π°
    bool loadFromFile(const QString& filename) {
        QFile file(filename);
        
        if (!file.open(QIODevice::ReadOnly)) {
            qDebug() << "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» для чтСния:" << file.errorString();
            return false;
        }
        
        QDataStream stream(&file);
        stream.setVersion(QDataStream::Qt_6_0);
        
        // Π§Ρ‚Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°
        QString className;
        quint32 version;
        
        stream >> className >> version;
        
        if (className != "SerializableObject" || version != 1) {
            qDebug() << "НСвСрный Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ„Π°ΠΉΠ»Π°";
            file.close();
            return false;
        }
        
        // Π§Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…
        stream >> name_ >> id_ >> data_;
        
        file.close();
        return stream.status() == QDataStream::Ok;
    }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

#include <iostream>
#include <fstream>
#include <sstream>
#include <chrono>
#include <vector>
#include <algorithm>

class StreamAdvantagesDemo {
public:
    static void demonstrateEfficiency() {
        const size_t ITERATIONS = 1000000;
        
        // Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ строковых ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²
        auto stringStreamTime = measureStringStreamPerformance(ITERATIONS);
        auto stringConcatTime = measureStringConcatenationPerformance(ITERATIONS);
        
        std::cout << "StringStream врСмя: " << stringStreamTime << " мс" << std::endl;
        std::cout << "ΠšΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡ строк врСмя: " << stringConcatTime << " мс" << std::endl;
        std::cout << "УскорСниС: " << static_cast<double>(stringConcatTime) / stringStreamTime << "x" << std::endl;
        
        // ДСмонстрация эффСктивности ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…
        demonstrateLargeDataProcessing();
    }
    
private:
    static long long measureStringStreamPerformance(size_t iterations) {
        auto start = std::chrono::high_resolution_clock::now();
        
        for (size_t i = 0; i < iterations; ++i) {
            std::ostringstream oss;
            oss << "Iteration " << i << ": value=" << (i * 2) << ", result=" << (i % 100);
            std::string result = oss.str();
        }
        
        auto end = std::chrono::high_resolution_clock::now();
        return std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    }
    
    static long long measureStringConcatenationPerformance(size_t iterations) {
        auto start = std::chrono::high_resolution_clock::now();
        
        for (size_t i = 0; i < iterations; ++i) {
            std::string result = "Iteration " + std::to_string(i) + 
                               ": value=" + std::to_string(i * 2) + 
                               ", result=" + std::to_string(i % 100);
        }
        
        auto end = std::chrono::high_resolution_clock::now();
        return std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    }
    
    static void demonstrateLargeDataProcessing() {
        // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ большого Ρ„Π°ΠΉΠ»Π° с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ
        const size_t FILE_SIZE = 100 * 1024 * 1024; // 100 ΠœΠ‘
        createLargeFile("large_data.txt", FILE_SIZE);
        
        // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ„Π°ΠΉΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ
        auto streamTime = processWithStreams("large_data.txt");
        
        std::cout << "ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° 100 ΠœΠ‘ Ρ„Π°ΠΉΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ: " << streamTime << " мс" << std::endl;
        
        // ΠžΡ‡ΠΈΡΡ‚ΠΊΠ°
        std::remove("large_data.txt");
    }
    
    static void createLargeFile(const std::string& filename, size_t size) {
        std::ofstream file(filename);
        const std::string line = "This is a test line for large file processing.\n";
        
        for (size_t i = 0; i < size / line.length(); ++i) {
            file << line;
        }
    }
    
    static long long processWithStreams(const std::string& filename) {
        auto start = std::chrono::high_resolution_clock::now();
        
        std::ifstream file(filename);
        std::string line;
        size_t lineCount = 0;
        size_t charCount = 0;
        
        while (std::getline(file, line)) {
            lineCount++;
            charCount += line.length();
        }
        
        auto end = std::chrono::high_resolution_clock::now();
        return std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ

#include <iostream>
#include <fstream>
#include <sstream>
#include <memory>
#include <vector>

// Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ класс для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ
class ProcessingStream {
public:
    virtual ~ProcessingStream() = default;
    virtual void process(const std::string& data) = 0;
    virtual void flush() = 0;
};

// ΠŸΠΎΡ‚ΠΎΠΊ для логирования
class LoggingStream : public ProcessingStream {
private:
    std::ofstream logFile_;
    
public:
    explicit LoggingStream(const std::string& filename) 
        : logFile_(filename, std::ios::app) {}
    
    void process(const std::string& data) override {
        logFile_ << "[LOG] " << data << std::endl;
    }
    
    void flush() override {
        logFile_.flush();
    }
};

// ΠŸΠΎΡ‚ΠΎΠΊ для ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ (простая Π·Π°ΠΌΠ΅Π½Π° символов)
class EncryptionStream : public ProcessingStream {
private:
    std::unique_ptr<ProcessingStream> nextStream_;
    int shift_;
    
public:
    EncryptionStream(std::unique_ptr<ProcessingStream> next, int shift = 3)
        : nextStream_(std::move(next)), shift_(shift) {}
    
    void process(const std::string& data) override {
        std::string encrypted;
        for (char c : data) {
            encrypted += static_cast<char>(c + shift_);
        }
        nextStream_->process(encrypted);
    }
    
    void flush() override {
        nextStream_->flush();
    }
};

// ΠŸΠΎΡ‚ΠΎΠΊ для сТатия (ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ RLE)
class CompressionStream : public ProcessingStream {
private:
    std::unique_ptr<ProcessingStream> nextStream_;
    
public:
    CompressionStream(std::unique_ptr<ProcessingStream> next)
        : nextStream_(std::move(next)) {}
    
    void process(const std::string& data) override {
        std::string compressed;
        
        for (size_t i = 0; i < data.length(); ) {
            char current = data[i];
            size_t count = 1;
            
            while (i + count < data.length() && data[i + count] == current && count < 255) {
                count++;
            }
            
            compressed += static_cast<char>(count);
            compressed += current;
            i += count;
        }
        
        nextStream_->process(compressed);
    }
    
    void flush() override {
        nextStream_->flush();
    }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π¦Π΅ΠΏΠΎΡ‡ΠΊΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

class StreamChainDemo {
public:
    static void demonstrateChainProcessing() {
        // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ: Π‘ΠΆΠ°Ρ‚ΠΈΠ΅ -> Π¨ΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ -> Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
        auto logger = std::make_unique<LoggingStream>("processed.log");
        auto encryptor = std::make_unique<EncryptionStream>(std::move(logger), 5);
        auto compressor = std::make_unique<CompressionStream>(std::move(encryptor));
        
        // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ
        std::vector<std::string> testData = {
            "Hello World! This is a test message.",
            "AAAAABBBBCCCDDEEF", // Π”Π°Π½Π½Ρ‹Π΅ для сТатия
            "Another test message with different content."
        };
        
        for (const auto& data : testData) {
            compressor->process(data);
        }
        
        compressor->flush();
        
        std::cout << "ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°." << std::endl;
        std::cout << "Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ сохранСны Π² processed.log" << std::endl;
    }
};
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ прСимущСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°

  1. Унификация интСрфСйса - Π΅Π΄ΠΈΠ½Ρ‹ΠΉ способ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ источниками Π΄Π°Π½Π½Ρ‹Ρ…
  2. Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ² - компилятор ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ
  3. АвтоматичСская ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок - ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΠΊΠΎΠ΄Ρ‹ состояния
  4. Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ - Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒ Π² Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²
  5. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ - оптимизированная буфСризация ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°
  6. Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ - стандартизированный интСрфСйс across Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π›ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ

  1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ RAII - автоматичСскоС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ рСсурсами
  2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠΉΡ‚Π΅ состояниС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² - всСгда провСряйтС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ
  3. ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ - коррСктная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок
  4. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ - для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ
  5. Π—Π°ΠΊΡ€Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ - явноС Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹
  6. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ соврСмСнныС возмоТности C++ - ΡƒΠΌΠ½Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ автоматичСскоС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Qt

  • QFile ΠΈ QTextStream для тСкстовых Ρ„Π°ΠΉΠ»ΠΎΠ²
  • QDataStream для Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ сСриализации
  • QBuffer для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² памяти
  • QTcpSocket ΠΈ QUdpSocket для сСтСвых ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²
  • Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты для асинхронной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Вопросы для самопровСрки

  1. КакиС основныС классы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π² C++?
  2. Π§Π΅ΠΌ отличаСтся тСкстовый Ρ€Π΅ΠΆΠΈΠΌ ΠΎΡ‚ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ?
  3. Как Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ бСзопасноС Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ„Π°ΠΉΠ»Π°?
  4. КакиС прСимущСства Π΄Π°Π΅Ρ‚ использованиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Qt?
  5. Как ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ с большими Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ?
  6. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сСриализация ΠΈ Π³Π΄Π΅ ΠΎΠ½Π° примСняСтся?
  7. Как ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ?
  8. КакиС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ I/O ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ?
  9. Как Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ манипуляторы для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²?
  10. Как ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ошибки ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°?
ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ